﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data.OleDb;
using System.Data;
using System.Collections;

namespace InmobiliariaDatos
{
    public class Datos
    {
        enum Cli { Dni, Nombre, Apellido, Direccion, Localidad, Telefono, Clave };
        enum Inm { Numero, Direccion, Localidad, Ambientes, TipoOp, Monto, Reservado };
		enum Operac{Numero, Fecha, Monto, Dni, IdInmueble, TipoOp};
        
		private static OleDbDataAdapter da = null;
        private static OleDbCommand cmd = null;
        private static DataSet ds = null;
        private static OleDbConnection con = null;
        //private static string strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Proyectos NET\Inmobiliaria.mdb;User Id=admin;Password=;";
        private static string strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Naná\Documents\Facultad\Ingenieria\Electiva de Programación\Fuentes\TP Cursada\Inmobiliaria.mdb;User Id=admin;Password=;";

        /*===========================================
        METODOS DE INMUEBLE
        ============================================*/ 
      

        public static bool RecuperarInmuebles(ArrayList datosInmueble)
        {
            ArrayList inmueble;
            bool todoBien = false;
            string consulta = "SELECT * FROM Inmuebles";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(consulta, con);
                ds = new DataSet();
                da.Fill(ds);

                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    inmueble = new ArrayList();
                    IEnumerator en = ds.Tables[0].Rows[i].ItemArray.GetEnumerator();
                    
                    while (en.MoveNext())
                    {
                        inmueble.Add(en.Current);
                    }

                    datosInmueble.Add(inmueble);
                }

                if (ds.Tables[0].Rows.Count > 0)
                    todoBien = true;

            }
            finally
            {
                con.Close();
                ds.Dispose();
                da.Dispose();
                con.Dispose();
            }
            return todoBien;
        }

        public static bool guardarInmueble(ArrayList datosInmueble)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            int numero = Convert.ToInt32(datosInmueble[(int)Inm.Numero].ToString());
            string localidad = datosInmueble[(int)Inm.Localidad].ToString();
            string direccion = datosInmueble[(int)Inm.Direccion].ToString();
            int cantidadAmbientes = Convert.ToInt32(datosInmueble[(int)Inm.Ambientes].ToString());
            string tipoOperacion = datosInmueble[(int)Inm.TipoOp].ToString();
            float monto = Convert.ToSingle(datosInmueble[(int)Inm.Monto].ToString());
            bool reservado = Convert.ToBoolean(datosInmueble[(int)Inm.Reservado].ToString());

            try
            {
                consulta = "INSERT INTO Inmuebles (Numero, Localidad, Direccion, Ambientes, Monto, TipoOperacion, Reservado) " +
                   "Values (" + numero + ",'" + localidad + "','" + direccion + "'," +
                   cantidadAmbientes + ", " + monto + ",'" + tipoOperacion + "'," + reservado + ");";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool modificarInmueble(ArrayList datosInmueble)
        {
            bool todoBien = false;
            string consulta = String.Empty;
            
            int numero = Convert.ToInt32(datosInmueble[(int)Inm.Numero].ToString());
            string localidad = datosInmueble[(int)Inm.Localidad].ToString();
            string direccion = datosInmueble[(int)Inm.Direccion].ToString();
            int cantidadAmbientes = Convert.ToInt32(datosInmueble[(int)Inm.Ambientes].ToString());
            string tipoOperacion = datosInmueble[(int)Inm.TipoOp].ToString();
            float monto = Convert.ToSingle(datosInmueble[(int)Inm.Monto].ToString());
            bool reservado = Convert.ToBoolean(datosInmueble[(int)Inm.Reservado].ToString());

            try
            {

                consulta = "UPDATE Inmuebles SET Localidad = '" + localidad + 
                    "', Direccion = '" + direccion + 
                    "', Ambientes = " + cantidadAmbientes + 
                    ", Monto = " + monto + 
                    ", TipoOperacion = '" + tipoOperacion + 
                    "', Reservado = " + reservado +
                    " WHERE Numero = " + numero + ";";
                  
                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;

            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool eliminarInmueble(ArrayList datosInmueble)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            string numero = datosInmueble[(int)Inm.Numero].ToString();
          

            try
            {
                consulta = "DELETE FROM Inmuebles WHERE Numero=" + numero + ";";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool reservarInmueble(int numero, bool reserva)
        {
            bool todoBien = false;
            string consulta = String.Empty;
            
            try
            {
                consulta = "UPDATE Inmuebles SET Reservado = " + reserva +
                    " WHERE Numero = " + numero + ";";
                  
                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool modificarInmueble(int numero, string tipoOp)
        {
            bool todoBien = false;
            string consulta = String.Empty;
            
            try
            {
                consulta = "UPDATE Inmuebles SET TipoOperacion = '" + tipoOp + "' WHERE Numero = " + numero + ";";
                  
                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }
        

        /*===========================================
        METODOS DE CLIENTE
        ============================================*/ 
        public static bool modificarCliente(ArrayList datosCliente)
        {
            bool todoBien = false;
            string consulta = String.Empty;
            
            int dni = Convert.ToInt32(datosCliente[(int)Cli.Dni].ToString());
            string nombre = datosCliente[(int)Cli.Nombre].ToString();
            string apellido = datosCliente[(int)Cli.Apellido].ToString();
            string direccion = datosCliente[(int)Cli.Direccion].ToString();
            string localidad = datosCliente[(int)Cli.Localidad].ToString();
            int telefono = Convert.ToInt32(datosCliente[(int)Cli.Telefono].ToString());


            try
            {
                consulta = "UPDATE Clientes SET Nombre = '" + nombre + "', Apellido = '" + apellido + "',  Telefono = " + telefono + ", Direccion = '" + direccion + "', Localidad = '" + localidad + "' WHERE Dni = " + dni + ";";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool RecuperarClientes(ArrayList datosCliente)
        {
            ArrayList cliente;
            bool todoBien = false;
            string consulta = "SELECT * FROM Clientes";

            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(consulta, con);
                ds = new DataSet();
                da.Fill(ds);

                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    cliente = new ArrayList();
                    IEnumerator en = ds.Tables[0].Rows[i].ItemArray.GetEnumerator();

                    while (en.MoveNext())
                    {
                        cliente.Add(en.Current);
                    }

                    datosCliente.Add(cliente);
                }

                if (ds.Tables[0].Rows.Count > 0)
                    todoBien = true;

            }
            finally
            {
                con.Close();
                ds.Dispose();
                da.Dispose();
                con.Dispose();
            }
            return todoBien;
        }

        public static bool guardarCliente(ArrayList datosCliente)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            int dni = Convert.ToInt32(datosCliente[(int)Cli.Dni].ToString());
            string nombre = datosCliente[(int)Cli.Nombre].ToString();
            string apellido = datosCliente[(int)Cli.Apellido].ToString();
            string direccion = datosCliente[(int)Cli.Direccion].ToString();
            string localidad = datosCliente[(int)Cli.Localidad].ToString();
            int telefono = Convert.ToInt32(datosCliente[(int)Cli.Telefono].ToString());

            try
            {
                consulta = "INSERT INTO Clientes (Dni, Nombre, Apellido, Telefono, Direccion, Localidad, Clave) " +
                   "Values (" + dni + ",'" + nombre + "','" + apellido + "'," +
                   telefono + ", '" + direccion +"', '" + localidad + "', 'clave');";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool eliminarCliente(ArrayList datosCliente)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            string nombre = datosCliente[(int)Cli.Nombre].ToString();
            int dni = Convert.ToInt32(datosCliente[(int)Cli.Dni].ToString());
            string direccion = datosCliente[(int)Cli.Direccion].ToString();
            int telefono = Convert.ToInt32(datosCliente[(int)Cli.Telefono].ToString());

            try
            {
                consulta = "DELETE FROM Clientes WHERE dni=" + dni + ";";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        /*===========================================
        METODOS DE OPERACION
        ============================================*/ 
        public static bool RecuperarOperaciones(ArrayList datosOperacion)
        {
            ArrayList operacion;
            bool todoBien = false;
            string consulta = "SELECT * FROM Operaciones";
            
            try
            {
                con = new OleDbConnection(strCon);
                con.Open();
                da = new OleDbDataAdapter(consulta, con);
                ds = new DataSet();
                da.Fill(ds);

                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    operacion = new ArrayList();
                    IEnumerator en = ds.Tables[0].Rows[i].ItemArray.GetEnumerator();

                    while (en.MoveNext())
                    {
                        operacion.Add(en.Current);
                    }

                    datosOperacion.Add(operacion);
                }

                if (ds.Tables[0].Rows.Count > 0)
                    todoBien = true;

            }
            finally
            {
                con.Close();
                ds.Dispose();
                da.Dispose();
                con.Dispose();
            }
            return todoBien;
        }

        public static bool guardarOperacion(ArrayList datosOperacion)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            int numero = Convert.ToInt32(datosOperacion[(int)Operac.Numero].ToString());
            DateTime fecha = Convert.ToDateTime(datosOperacion[(int)Operac.Fecha].ToString());
            float monto = float.Parse(datosOperacion[(int)Operac.Monto].ToString());
            int dni = Convert.ToInt32(datosOperacion[(int)Operac.Dni].ToString());
            int inmueble = Convert.ToInt32(datosOperacion[(int)Operac.IdInmueble].ToString());
            string tipoop = datosOperacion[(int)Operac.TipoOp].ToString();

            try
            {
                consulta = "INSERT INTO Operaciones (Numero, Fecha, Monto, DNI, idinmueble, tipooperacion) " +
                   "Values (" + numero + ",'" + fecha + "'," + monto + "," +
                   dni + ", " + inmueble + ", '" + tipoop + "');";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }


        public static bool modificarOperacion(ArrayList datosOperacion)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            int numero = Convert.ToInt32(datosOperacion[(int)Operac.Numero].ToString());
            DateTime fecha = Convert.ToDateTime(datosOperacion[(int)Operac.Fecha].ToString());
            float monto = float.Parse(datosOperacion[(int)Operac.Monto].ToString());
            int dni = Convert.ToInt32(datosOperacion[(int)Operac.Dni].ToString());
            int inmueble = Convert.ToInt32(datosOperacion[(int)Operac.IdInmueble].ToString());
            char tipoop = Convert.ToChar(datosOperacion[(int)Operac.TipoOp].ToString());

            try
            {
                consulta = "UPDATE Operaciones SET Fecha = '" + fecha +
                    "', Monto = '" + monto +
                    "', DNI = " + dni +
                    ", idinmueble = " + inmueble +
                    ", tipooperacion = '" + tipoop +
                    " WHERE Numero = " + numero + ";";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;

            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool eliminarOperacion(ArrayList datosOperacion)
        {
            bool todoBien = false;
            string consulta = String.Empty;

            string numero = datosOperacion[(int)Operac.IdInmueble].ToString();

            try
            {
                consulta = "DELETE FROM Operaciones WHERE IdInmueble = " + numero + ";";

                Datos.con = new OleDbConnection(Datos.strCon);
                Datos.con.Open();
                Datos.cmd = new OleDbCommand(consulta, Datos.con);
                Datos.cmd.ExecuteNonQuery();
                todoBien = true;
            }
            finally
            {
                Datos.con.Close();
                Datos.con.Dispose();
                Datos.cmd.Dispose();
            }
            return todoBien;
        }

        public static bool GuardarInmobiliaria(object o)
        {
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                FileStream miArchivo = new FileStream("Inmobiliaria.dat", FileMode.Create);
                bf.Serialize(miArchivo, o);
                miArchivo.Close();
            }
            catch (Exception ex)
            {
                return false;
            }
           
            return true;
        }

        
        /*===========================================
        METODOS DE INSTANCIA INMOBILIARIA
        ============================================*/ 
        public static object RecuperarInmobiliaria()
        {
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                FileStream miArchivo = new FileStream("Inmobiliaria.dat", FileMode.OpenOrCreate);
                object o = bf.Deserialize(miArchivo);
                miArchivo.Close();
                return o;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
}
